// 7.1.5 拷贝、赋值和析构
/**
 * 除了定义类的对象如何初始化之外，类还需要控制拷贝、赋值和销毁对象时发生的行为。
 * 如果我们不主动定义这些操作，则编译器将替我们合成它们。一般来说，编译器生成的版本将对对象的每个成员执行拷贝、赋值和销毁操作。
 * 
 * 例如在7.1.1节（第229页）的书店程序中，当编译器执行如下赋值语句时，
 * total = trans; // 处理下一本书的信息
 * 它的行为与下面的代码相同：
 * total.bookNo = trans.bookNo;
 * total.units_sold = trans.units_sold;
 * total.revenue = trans.revenue;
 * 
 * 尽管编译器能替我们合成拷贝、赋值和销毁的操作，但是必须要清楚的一点是，对于某些类来说合成的版本无法正常工作。
 * 特别是，当类需要分配类对象之外的资源时，合成的版本常常会失效。
 * 
 * 使用vector或者string的类能避免分配和释放内存带来的复杂性。
 * 进一步讲，如果类包含vector或者string成员，则其拷贝、赋值和销毁的合成版本能够正常工作。
 * 
 * 在学习第13章关于如何自定义操作的知识之前，类中所有分配的资源都应该直接以类的数据成员的形式存储。
 * 
 */